package com.ztom.agent.util;

import java.util.Set;

/**
 * 该类用于解析 MyTraceAgent 自定义的包路径表达式解析
 * 规则：
 * 1、可以用 [] 代表集合的概念，集合 [e1,e2,e3] 中包含多个元素，每个元素由英文逗号分隔，元素可以是 package 和 class。但 [] 不可嵌套出现。例如：
 *  com.ztom.agent.util.[Logger,DateCompareUtils] -> com.ztom.agent.log.Logger;com.ztom.agent.util.DateCompareUtils
 * <p>
 * 2、可以用 * 代表贪心匹配，可以匹配多个字符。
 *
 * @author ZhangTao
 */
public final class PkgExpUtils {

    public static Set<String> parse(String expStr) {
        int leftIdx = expStr.indexOf("[");
        if (leftIdx < 0) {
            return SetUtils.of(expStr);
        }

        int rightIdx = expStr.indexOf("]", leftIdx);
        if (rightIdx < 0) {
            throw new IllegalArgumentException("PkgExpUtils.parse(\"" + expStr + "\"): '[' always paired with ']'");
        }

        String prefixStr = expStr.substring(0, leftIdx);
        String suffixStr = rightIdx + 1 < expStr.length() ? expStr.substring(rightIdx + 1) : "";

        String elementsStr = expStr.substring(leftIdx + 1, rightIdx);
        String[] elements = elementsStr.split(",");
        Set<String> result = SetUtils.createHashSet(elements.length);
        for (String element : elements) {
            String subExpStr = prefixStr.concat(element).concat(suffixStr);
            result.addAll(parse(subExpStr));
        }
        return result;
    }

    public static void main(String[] args) {
        String str = "com.ztom.agent.asm.plugin*[HttpServletRequestPlugin,JedisCmdPlugin]";
        for (String s : parse(str)) {
            System.out.println(s);
        }
    }
}
